package com.jh.pattern.singleton.lazy;

/**
 * @author JH_Wong
 * @projectName newforward
 * @title
 * @package com.jh.pattern.singleton.lazy
 * @description
 * @date 2019-05-10 17:53
 */
public class LazyDoubleCheckSingleton {


    private static LazyDoubleCheckSingleton lazySingleton = null;

    private LazyDoubleCheckSingleton() {
    }

    /**
     * 将锁的范围缩小，让线程都可以进入方法的内部
     * 内部的 synchronized 不是锁整个类的，是锁当前方法的，
     * 当t1进入synchronized包含的里面时，t2状态就挂起了
     * 然后t1出来后，t2进去了，如果这时里面没有二次判断的话，就会又new了一次，所以需要再判断一次
     * 判断后发现已经new过了就直接返回了
     * 但是始终使用了锁，性能上肯定是有影响的，所以下面优化请参考静态内部类的实现方式
     */
    public static LazyDoubleCheckSingleton getInstance() {

        if (null == lazySingleton) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (null == lazySingleton) {
                    lazySingleton = new LazyDoubleCheckSingleton();
                }
            }
        }

        return lazySingleton;
    }

}
